package fr.miage.course7.app.model;

import java.util.GregorianCalendar;
import java.util.TreeSet;

/**
 * Modelise un participant.
 * @author Gloria ARAOZ
 * @author Leticia HUETE
 * @author Mickael LAROCHE
 */
public class Participant {

    /**
     * Categorie d'un bateau.
     */
    public enum Categorie {
        /** Defini un catamaran. */
        catamaran,
        /** Defini un monocoque. */
        monocoque,
        /** Defini un trimaran. */
        trimaran;
    }

    /**
     * Identificant du participant.
     */
    private int identifiant;

    /**
     * Categorie du participant.
     */
    private Categorie categorie;

    /**
     * Nom du bateau.
     */
    private String nomBateau;

    /**
     * Nom du skipper.
     */
    private String nomSkipper;

    /**
     * Numero de l'étape courante.
     */
    private int derniereEtape = 0;

    /**
     * Liste des transmissions.
     */
    private TreeSet<Transmission> transmissions;


    /**
     * Contructeur.
     * @param id l'identifiant du participant
     * @param c sa categorie
     * @param bat le nom de son bateau
     * @param skip le nom du skippeur
     */
    public Participant(final int id,
                       final Categorie c,
                       final String bat,
                       final String skip) {
        identifiant = id;
        categorie = c;
        nomBateau = bat;
        nomSkipper = skip;
        transmissions = new TreeSet<Transmission>();
    }

    /**
     * Enregistre une nouvelle transmission GPS.
     * @param date la date de la transmission
     * @param lat la latitude lors de la transmission
     * @param lon la longitude lors de la transmission
     * @param incEtape l'atteinte d'une nouvelle etape de l'itineraire
     *                 (1 si etape atteinte, 0 sinon)
     * @return la transmission enregistree
     */
    public final Transmission nouvelleTransmission(final GregorianCalendar date,
                                                   final int lat,
                                                   final int lon,
                                                   final int incEtape) {
        derniereEtape = derniereEtape + incEtape;
        Transmission temp = new Transmission(identifiant, date, lat, lon);
        transmissions.add(temp);
        return temp;
    }

    /**
     * Enregistre une nouvelle tranmission GPS.
     * @param transmission la transmission a enregistrer
     */
    public final void nouvelleTransmission(final Transmission transmission) {
        this.transmissions.add(transmission);
    }

    /**
     * Retourne la derniere position envoyee par le participant.
     * @return la derniere position envoyee par le participant
     *         ou null si la course n'a pas commence
     */
    public final Position dernierePosition() {
        if (transmissions.size() < 1) {
            return null;
        } else {
            return transmissions.last().getPosition();
        }
    }

    /**
     * Retourne l'identifiant du participant.
     * @return l'identifiant du participant
     */
    public final int getIdentifiant() {
        return identifiant;
    }

    /**
     * Retourne le numero de la derniere etape de l'itineraire atteinte.
     * @return le numero de la derniere etape de l'itineraire
     *         atteinte (commencant a 1 pour le depart)
     */
    public final int getDerniereEtape() {
        return derniereEtape;
    }

    /**
     * Retourne le nom du bateau.
     * @return le nom du bateau
     */
    public final String getNomBateau() {
        return nomBateau;
    }

    /**
     * Retourne le nom de la categorie du bateau.
     * @return le nom de la categorie du bateau
     */
    public final String getCategorie() {
        return categorie.name();
    }

    /**
     * Retourne le nom du skipper.
     * @return le nom du skipper
     */
    public final String getNomSkipper() {
        return nomSkipper;
    }

    /**
     * Afficheur.
     * @return la classe sous forme de String
     */
    @Override
    public final String toString() {
        return getClass().getSimpleName() + '@'
                + Integer.toHexString(hashCode())
                + " [categorie=" + categorie + ", identifiant="
                + identifiant + ", nomBateau=" + nomBateau + ", nomSkipper="
                + nomSkipper + ", transmission=" + transmissions + "]";
    }

    /**
     * Retourne l'ensemble des transmissions du participant.
     * @return l'ensemble (TreeSet<Transmission>)
     *         des transmissions du participant
     */
    public final TreeSet<Transmission> getTransmissions() {
        return transmissions;
    }

    /**
     * Definie l'etape courante du participant.
     * @param etape : dernière etape du participant
     */
    public final void setEtape(final int etape) {
        this.derniereEtape = etape;
    }

}
